package com.aaa.service.impl;

import com.aaa.service.UserService;
import com.aaa.mapper.UserMapper;
import com.aaa.entity.Users;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

/**
 * 包括用户登录、根据手机号查找用户以及修改用户密码等操作。
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private BCryptPasswordEncoder passwordEncoder;

    /**
     * 用户登录方法，用于验证用户输入的手机号和密码是否正确。
     *
     * @param phone  用户输入的手机号
     * @param password 用户输入的密码
     * @return 如果验证成功，返回对应的 Users 对象；否则返回 null
     */
    @Override
    public Users loginUser(String phone, String password) {
        // 根据手机号从数据库中查找用户
        Users user = userMapper.findByPhoneName(phone);
        if (user != null) {
            // 获取数据库中用户密码
            String storedPassword = user.getPassword();
            // 判断数据库中的密码是否已经加密
            if (!isEncoded(storedPassword)) {
                // 如果未加密，使用 BCryptPasswordEncoder 对密码进行加密
                String encodedPassword = passwordEncoder.encode(storedPassword);
                // 将加密后的密码设置到用户对象中
                user.setPassword(encodedPassword);
                // 将加密后的密码更新到数据库中
                if (userMapper.updatePassword(user.getId(), encodedPassword) > 0) {
                    // 更新成功后，将存储的密码替换为加密后的密码
                    storedPassword = encodedPassword;
                }
            }
            // 使用 BCryptPasswordEncoder 验证用户输入的密码和数据库中存储的密码是否匹配
            if (passwordEncoder.matches(password, storedPassword)) {
                // 匹配成功，返回用户对象
                return user;
            }
        }
        // 验证失败，返回 null
        return null;
    }

    /**
     * 根据用户 ID 修改用户密码。
     *
     * @param id 用户的唯一标识
     * @param password 用户输入的新密码
     * @return 返回更新的行数，大于0表示更新成功
     */
    @Override
    public int updatePassword(String id, String password) {
        // 使用注入的 passwordEncoder 加密密码
        String encodedPassword = passwordEncoder.encode(password);
        // 更新密码，返回更新的行数
        return userMapper.updatePassword(id, encodedPassword);
    }
    
    /**
     * 根据用户ID获取用户信息。
     *
     * @param id 用户唯一标识（UUID）
     * @return 如果找到用户则返回用户对象，否则返回 null
     */
    @Override
    public Users getUserById(String id) {
        return userMapper.findById(id);
    }
    
    /**
     * 判断密码是否已经加密。
     *
     * @param password 要判断的密码
     * @return 如果密码已经加密返回 true，否则返回 false
     */
    private boolean isEncoded(String password) {
        return password != null && password.startsWith("$2a$");
    }

    /**
     * 检查手机号是否存在于数据库中。
     *
     * @param phoneNumber 要检查的手机号
     * @return 如果手机号存在于数据库中返回 true，否则返回 false
     */
    public boolean isPhoneNumberExists(String phoneNumber) {
        return userMapper.findByPhoneName(phoneNumber) != null;
    }
}